home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / dorskel2.arc / DOORMISC.C < prev    next >
C/C++ Source or Header  |  1991-12-05  |  9KB  |  374 lines

  1. /**********************************************/
  2. /*                                              */
  3. /* XBBS Door Skeleton -- TC 2.0/MSC 6.0a code */
  4. /* Copyright (c) 1990/91 by M. Kimes          */
  5. /* All Rights Reserved                        */
  6. /* May be freely used for >>>FREE<<< programs */
  7. /* as long as you don't try to save any souls */
  8. /* (nasty habit)                              */
  9. /*                                            */
  10. /**********************************************/
  11.  
  12. /* Always include this module (with appropriate #defines) */
  13. /* Miscellaneous junk this module */
  14.  
  15. /**************************************************************************
  16.   Miscellaneous notes:
  17.  
  18.     #define XBBS and the program will be compiled to read ONLINE.XBS
  19.     #define DORINFO and the program will be compiled to read DORINFO?.DEF
  20.     #define both and first ONLINE.XBS will be read, then DORINFO?.DEF
  21.     (don't know why you'd wanna do that)
  22.     #define neither and all info must come from command line
  23.     #define FINDUSER and a routine to find a given user (by name) will
  24.             be compiled in (finduser()) for XBBS' USERS.BBS
  25.     #define NOREADFILE and the file reader routine (readtext()) will NOT
  26.             be compiled
  27.     #define DISABLEBREAK to disable CTRL-BREAK/CTRL-C
  28.     #define DIALTRANS to include code for sending modem control strings
  29.  
  30.     set chars to be unsigned by default
  31.     recommend large model (recompile screen2.asm and ansi.asm if other)
  32.     this code requires a FOSSIL for serial i/o--see function fossil()
  33. ***************************************************************************/
  34.  
  35. #include "doorskel.h"   /* XBBS include file */
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42. char * _fastcall addtolog (char *text) { /* write entries to logfile */
  43.  
  44.     FILE *pf;
  45.     char p[127];
  46.  
  47.  
  48.     pf = fopen(logfile,"a");
  49.     if (pf == NULL) return text;
  50.     fseek(pf,0,SEEK_END);
  51.     if (text[0] != '*') {
  52.         strcpy(p,fidodate());
  53.         p[16] = 0;
  54.         strcat(p,"  ");
  55.         strncat(p,text,126 - strlen(p));
  56.         p[126] = 0;
  57.     }
  58.     else {
  59.         strncpy(p,text,79);
  60.         p[79] = 0;
  61.     }
  62.     fputs(p,pf);
  63.     fputs("\n",pf);
  64.     fclose(pf);
  65.     return text;
  66. }
  67.  
  68.  
  69.  
  70. /* Position cursor */
  71.  
  72. void _fastcall cursor (int x, int y) {
  73.  
  74. #ifndef __TURBOC__
  75.     union REGS rg;
  76. #endif
  77.  
  78.  
  79.     x--;
  80.     y--;
  81. #ifndef __TURBOC__
  82.     rg.x.ax = 0x0200;
  83.     rg.x.bx = 0;
  84.     rg.x.dx = ((y << 8) & 0xff00) + x;
  85.     int86(0x10,&rg,&rg);
  86. #else
  87.     _AX = 0x0200;
  88.     _BX = 0;
  89.     _DX = ((y << 8) & 0xff00) + x;
  90.     geninterrupt(0x10);
  91. #endif
  92. }
  93.  
  94. /* Return cursor position */
  95.  
  96. void _fastcall curr_cursor (int *x,int *y) {
  97.  
  98. #ifndef __TURBOC__
  99.     union REGS rg;
  100.  
  101.  
  102.     rg.x.ax = 0x0300;
  103.     rg.x.bx = 0;
  104.     int86(0x10,&rg,&rg);
  105.     *x = rg.h.dl + 1;
  106.     *y = rg.h.dh + 1;
  107. #else
  108.     _AX = 0x0300;
  109.     _BX = 0;
  110.     geninterrupt(0x10);
  111.     *x = _DL + 1;
  112.     *y = _DH + 1;
  113. #endif
  114. }
  115.  
  116. /* insensitive strstr() */
  117.  
  118. char * _fastcall stristr (char *t, char *s) {
  119.  
  120.    char *t1;
  121.    char *s1;
  122.  
  123.  
  124.    while(*t) {
  125.       t1=t;
  126.       s1=s;
  127.       while(*s1) {
  128.          if (toupper(*s1)!=toupper(*t)) break;
  129.          else {
  130.             s1++;
  131.             t++;
  132.          }
  133.       }
  134.       if (!*s1) return t1;
  135.       t=t1+1;
  136.    }
  137.    return NULL;
  138. }
  139.  
  140.  
  141.  
  142. char * _fastcall stripcr (char *a) {  /* Strips trailing CR's & LF's */
  143.  
  144.   while (a[strlen(a)-1]=='\n' || a[strlen(a)-1]=='\r') a[strlen(a)-1]=0;
  145.   return a;
  146. }
  147.  
  148.  
  149.  
  150.  
  151. char * _fastcall lstrip (char *a) {    /* Strips leading blanks */
  152.  
  153.     while (*a == ' ') memmove (a,(a + 1),strlen(a));
  154.     return (a);
  155. }
  156.  
  157.  
  158.  
  159. char * _fastcall rstrip (char *a) {    /* Strips trailing blanks */
  160.  
  161.     while (*a && a[strlen(a) - 1] == ' ') a[strlen(a) - 1] = 0;
  162.     return a;
  163. }
  164.  
  165.  
  166.  
  167.  
  168. char _fastcall spawnit (char *strr) {
  169.  
  170.     /* Use this function to spawn external programs (like file transfer
  171.        protocols, archivers, etc.)  Just pass the string as you would
  172.        to system() except remember that it doesn't go through the
  173.        command processor (i.e. spawnit(getenv("COMSPEC")); not just
  174.        spawnit(""); ).  It'll clear the screen, run the program, then
  175.        return you to the appropriate drive and directory and redraw
  176.        the screen.  For a function that will swap to EMS or disk, I
  177.        direct you to the XBBS or HeadEdit source, or shop around for
  178.        one of those fancy packages they have now for XMS/EMS/disk
  179.        swapping and plug it in. */
  180.  
  181.    char *e[26];
  182.    static char a[256];
  183.    register word x;
  184.    int level = 0;
  185.    union REGS r;
  186.    char middle[MAXDIR+2];
  187.    word drive,temp;
  188.    char dir[MAXDIR];
  189.  
  190.  
  191.    if(!strr || !*strr) return (char)(level = 1);
  192.  
  193.    set_cooked();
  194. #ifndef __TURBOC__
  195.    _dos_getdrive(&drive);
  196.    getcwd(dir,MAXDIR);
  197. #else
  198.    drive=getdisk();
  199.    getcurdir(++drive,dir);
  200. #endif
  201.    fossil(DEINIT,0);
  202.    fputs("\n\x1b[2J",stdout);
  203.    if(strr == getenv("COMSPEC")) {
  204.        fputs("EXIT to return to Door\n",stdout);
  205.    }
  206.    strcpy(a,strr);
  207.    for (x=0;x<26;x++) e[x]=NULL;
  208.    e[0]=strtok(a," ");
  209.    for (x = 1;(e[x] = strtok(0," "));x++) if (x == 25) break;
  210.    level = (int)spawnvp(P_WAIT,a,e);
  211.    fossil(INIT,0);
  212. #ifndef __TURBOC__
  213.    _dos_setdrive (drive,&temp);
  214. #else
  215.    setdisk (--drive);
  216. #endif
  217.    strcpy(middle,"\\");
  218.    strcat(middle,dir);
  219.    chdir(middle);
  220.  
  221.    if (!level) {
  222.        r.h.ah=77;
  223.        int86(33,&r,&r);
  224.        level=(int)r.h.al;
  225.    }
  226.  
  227.    set_raw();
  228.  
  229.    fputs("\x1b[2J\x1b[0m",stdout);
  230.    print_stat();
  231.  
  232.    return (char)level;
  233. }
  234.  
  235.  
  236. void _fastcall set_screen_size (void) {
  237.  
  238.     union REGS r;
  239.  
  240.  
  241.     r.h.ah = 0x0f;      /* set maxx and maxy globals to screen size */
  242.     int86(0x10,&r,&r);  /* this is called for you in DOORSKEL.C's main () */
  243.     if (maxx == 0)
  244.       maxx = (int) r.h.ah;
  245.     if (maxy == 0) {
  246.         r.x.ax = 0x1130;
  247.         r.x.dx = maxy;
  248.         int86(0x10,&r,&r);
  249.         maxy = (r.x.dx == 0) ? 25 : (r.x.dx + 1);   /* kludge, kludge, kludge */
  250.     }
  251. }
  252.  
  253.  
  254.  
  255. void _fastcall set_cooked (void) {
  256.  
  257.     union REGS rg;
  258.  
  259.  
  260.     rg.x.ax = 0x4400;         /* Set console in (std) cooked mode */
  261.     rg.x.bx = 1;
  262.     int86(33,&rg,&rg);
  263.     rg.h.dh = 0;
  264.     rg.h.dl = rg.h.dl & (char)(~0x20);
  265.     rg.x.ax = 0x4401;
  266.     int86(33,&rg,&rg);
  267. }
  268.  
  269.  
  270.  
  271. void _fastcall set_raw (void) {
  272.  
  273.     union REGS r;
  274.  
  275.  
  276.     r.h.ah = 0x33;
  277.     r.h.al = 0x01;
  278.     r.h.dl = 0x00;
  279.     int86(0x21,&r,&r);    /* turn ctrl-break flag off */
  280.  
  281.     r.x.ax = 0x4400;
  282.     r.x.bx = 1;
  283.     int86(0x21,&r,&r);
  284.     r.h.dh = 0;
  285.     r.h.dl = r.h.dl | 0x20;
  286.     r.x.ax = 0x4401;
  287.     int86(0x21,&r,&r);    /* set console in raw mode */
  288. }
  289.  
  290.  
  291.  
  292. /* Return video mode (B/W or color) */
  293.  
  294. int _fastcall vmode () {
  295.  
  296.     union REGS rg;
  297.  
  298.  
  299.     rg.h.ah = 15;
  300.     int86(16,&rg,&rg);
  301.     return rg.h.al;
  302. }
  303.  
  304.  
  305. #ifdef DIALTRANS
  306.  
  307.  int _fastcall dial_trans (char *s) {
  308.  
  309.     /* send chars to the modem with translation for ^v~| */
  310.     /* this won't be needed in a "normal" Door.  see also
  311.     /* macros SendByte and CSendByte. Note no carrier check
  312.     /* (obviously). */
  313.  
  314.     char *p = s;
  315.  
  316.  
  317.     while(p && *p) {
  318.         if(*p == '~') {         /* ~ = 1 second delay */
  319.             my_sleep(1);
  320.         }
  321.         else if(*p == '^') {    /* ^ = dtr up */
  322.             fossil(DTR,UP);
  323.         }
  324.         else if(*p == 'v') {    /* v = dtr down */
  325.             fossil(DTR,DOWN);
  326.         }
  327.         else if(*p == '|') {    /* | = carriage return */
  328.             while(!fossil(TRANSMIT,'\r'));
  329.         }
  330.         else {                  /* else just send character */
  331.             while(!fossil(TRANSMIT,*p));
  332.         }
  333.         p++;
  334.     }
  335.     return 0;
  336.  }
  337.  
  338.  
  339. int _fastcall recvbyte (void) {     /* note:  normally you'd use inkey()
  340.                                        to get a keypress.  this is for
  341.                                        special purposes not usually
  342.                                        encountered in a door.  note
  343.                                        there's no carrier check in this
  344.                                        one. */
  345.  
  346.     union REGS rg;
  347.  
  348.  
  349.     rg.x.dx = commport;
  350.     rg.h.ah = GETSTAT;
  351.     int86(20,&rg,&rg);
  352.     if (!(rg.h.ah & 1)) return -1;      /* no char available */
  353.     return (int)fossil(RECVWAIT,0);
  354. }
  355.  
  356.  
  357. int _fastcall is_carrier (void) {   /* note: carrier check is already
  358.                                        implemented in the normal door
  359.                                        routines.  this is for special
  360.                                        purposes not usually encountered
  361.                                        in a door */
  362.  
  363.     union REGS rg;
  364.  
  365.  
  366.     rg.x.dx = commport;
  367.     rg.h.ah = GETSTAT;
  368.     int86(20,&rg,&rg);
  369.     if (!(rg.h.al & 128)) return 0;     /* no carrier */
  370.     return -1;
  371. }
  372.  
  373. #endif
  374.